Added `-[NSArray validateAsPropertyList]` and `-[NSDictionary validateAsPropertyList...
[adiumx.git] / Plugins / Purple Service / AMPurpleJabberAdHocCommand.m
blob85e8ffda9ffc16632ac88d4e57c0fc0ed2a5d5a8
1 //
2 //  AMPurpleJabberAdHocCommand.m
3 //  Adium
4 //
5 //  Created by Evan Schoenberg on 9/5/07.
6 //
8 #import "AMPurpleJabberAdHocCommand.h"
9 #import "AMPurpleJabberFormGenerator.h"
10 #import "AMPurpleJabberAdHocServer.h"
12 @implementation AMPurpleJabberAdHocCommand
14 - (id)initWithServer:(AMPurpleJabberAdHocServer*)_server command:(xmlnode*)_command jid:(NSString*)_jid iqid:(NSString*)_iqid {
15         if((self = [super init])) {
16                 server = _server;
17                 command = xmlnode_copy(_command);
18                 jid = [_jid copy];
19                 iqid = [_iqid copy];
20         }
21         return self;
24 - (void)dealloc {
25         xmlnode_free(command);
26         [jid release];
27         [iqid release];
28         [sessionid release];
29         [super dealloc];
32 - (AMPurpleJabberFormGenerator*)form {
33         xmlnode *form = xmlnode_get_child_with_namespace(command,"x","jabber:x:data");
34         if(!form)
35                 return nil;
36         return [[[AMPurpleJabberFormGenerator alloc] initWithXML:form] autorelease];
39 - (NSString*)jid {
40         return jid;
43 - (NSString*)sessionid {
44         if(sessionid)
45                 return sessionid;
46         const char *sessionid_orig = xmlnode_get_attrib(command,"sessionid");
47         if(!sessionid_orig)
48                 return nil;
49         return [NSString stringWithUTF8String:sessionid_orig];
52 - (void)setSessionid:(NSString*)_sessionid {
53         id old = sessionid;
54         sessionid = [_sessionid copy];
55         [old release];
58 - (AMPurpleJabberAdHocCommand*)generateReplyWithForm:(AMPurpleJabberFormGenerator*)form actions:(NSArray*)actions defaultAction:(unsigned)defaultAction status:(enum AMPurpleJabberAdHocCommandStatus)status {
59         const char *nodeattr = xmlnode_get_attrib(command,"node");
60         if(!nodeattr)
61                 return nil;
62         xmlnode *newcmd = xmlnode_new("command");
63         xmlnode_set_namespace(newcmd,"http://jabber.org/protocol/commands");
64         xmlnode_set_attrib(newcmd,"node",nodeattr);
65         switch(status) {
66                 case executing:
67                         xmlnode_set_attrib(newcmd,"status","executing");
68                         break;
69                 case canceled:
70                         xmlnode_set_attrib(newcmd,"status","canceled");
71                         break;
72                 case completed:
73                         xmlnode_set_attrib(newcmd,"status","completed");
74                         break;
75         }
76         NSString *sessionid_orig = [self sessionid];
77         if(sessionid_orig)
78                 xmlnode_set_attrib(newcmd,"sessionid",[sessionid_orig UTF8String]);
79         
80         if(actions) {
81                 xmlnode *actionsnode = xmlnode_new_child(newcmd,"actions");
82                 xmlnode_set_attrib(actionsnode,"execute",[[actions objectAtIndex:defaultAction] UTF8String]);
83                 NSEnumerator *e = [actions objectEnumerator];
84                 NSString *actionstr;
85                 while((actionstr = [e nextObject]))
86                         xmlnode_new_child(actionsnode, [actionstr UTF8String]);
87         }
88         
89         xmlnode_insert_child(newcmd,[form xml]);
90         
91         AMPurpleJabberAdHocCommand *cmd = [[AMPurpleJabberAdHocCommand alloc] initWithServer:server command:newcmd jid:jid iqid:iqid];
92         xmlnode_free(newcmd);
93         return [cmd autorelease];
96 - (AMPurpleJabberAdHocCommand*)generateReplyWithNote:(NSString*)text type:(enum AMPurpleJabberAdHocCommandNoteType)type status:(enum AMPurpleJabberAdHocCommandStatus)status {
97         const char *nodeattr = xmlnode_get_attrib(command,"node");
98         if(!nodeattr)
99                 return nil;
100         xmlnode *newcmd = xmlnode_new("command");
101         xmlnode_set_namespace(newcmd,"http://jabber.org/protocol/commands");
102         xmlnode_set_attrib(newcmd,"node",nodeattr);
103         switch(status) {
104                 case executing:
105                         xmlnode_set_attrib(newcmd,"status","executing");
106                         break;
107                 case canceled:
108                         xmlnode_set_attrib(newcmd,"status","canceled");
109                         break;
110                 case completed:
111                         xmlnode_set_attrib(newcmd,"status","completed");
112                         break;
113         }
114         NSString *sessionid_orig = [self sessionid];
115         if(sessionid_orig)
116                 xmlnode_set_attrib(newcmd,"sessionid",[sessionid_orig UTF8String]);
117         
118         xmlnode *note = xmlnode_new_child(newcmd,"note");
119         switch(type) {
120                 case error:
121                         xmlnode_set_attrib(note,"type","error");
122                         break;
123                 case info:
124                         xmlnode_set_attrib(note,"type","info");
125                         break;
126                 case warn:
127                         xmlnode_set_attrib(note,"type","warn");
128                         break;
129         }
130         
131         xmlnode_insert_data(note,[text UTF8String],-1);
132         
133         AMPurpleJabberAdHocCommand *cmd = [[AMPurpleJabberAdHocCommand alloc] initWithServer:server command:newcmd jid:jid iqid:iqid];
134         xmlnode_free(newcmd);
135         return [cmd autorelease];
138 - (void)send {
139         PurpleAccount *account = [[server account] purpleAccount];
140         xmlnode *iq = xmlnode_new("iq");
141         
142         xmlnode_set_attrib(iq, "id", [iqid UTF8String]);
143         xmlnode_set_attrib(iq, "to", [jid UTF8String]);
144         xmlnode_set_attrib(iq, "type", "result");
145         xmlnode *cmdcopy = xmlnode_copy(command);
146         if(sessionid)
147                 xmlnode_set_attrib(cmdcopy, "sessionid", [sessionid UTF8String]);
148         xmlnode_insert_child(iq, cmdcopy);
149         
150         int len = 0;
151         char *text = xmlnode_to_str(iq, &len);
152         PURPLE_PLUGIN_PROTOCOL_INFO(purple_account_get_connection(account)->prpl)->send_raw(purple_account_get_connection(account), text, len);
153         g_free(text);
154         xmlnode_free(iq);
157 @end